#include "db_manager.h"

db_manager :: db_manager( )
{
	users = new Users( );
	sessions = new Sessions( );
	messages = new Messages( );

}

int db_manager :: db_open( )
{
	conn = PQconnectdb( "dbname=postgres host=localhost user=postgres password=6282" ); // перенести и в Table ?
	int status = PQstatus( conn );
	int result;
	if ( status == CONNECTION_OK )
		result = DB_OK;
	else
		result = DB_NO_CONN;
	return result;
}

void db_manager :: db_close(  )
{
	PQfinish( conn );
}

int db_manager :: db_create( )
{
	db_open( );

	int result = users-> Create( );
	result = sessions-> Create( );
	result = messages-> Create( );
	return result;
}


int db_manager :: db_clean( )
{
	int result = users-> Clean( );
	result = sessions-> Clean( );
	result = messages-> Clean( );
	return result;
}

int db_manager :: NewUser( char * login, char * pass )
{
	return users-> InsRecord( login, pass ); // если ошибка, то логин занят.
}

int db_manager ::  GetSession( char * login, char * pass, int & session )
{
	int iduser;
	session = -1;
	int result = users-> FindRecord( login, pass, iduser ); // если ошибка, то либо логин, либо пароль указан. неверно.
	if ( result == DB_OK )
		result = sessions-> InsRecord( iduser, session ); // ошибок быть не должно.
	return result;
}

int db_manager :: NewMessage( int idsession, char * text )
{
	int iduser;
	int result = sessions-> GetIduser( idsession, iduser ); // ошибок быть не должно.
	if ( result == DB_OK )
	{
		result = messages-> InsRecord( iduser, text ); // ошибок быть не должно.
	}
	return result;
}

int db_manager :: GetLastMessages( int n, char * * user, int * time_, char * * text )
{
	int * iduser = new int [ n ];
	int result = messages-> GetLastMessage( n, iduser, time_, text ); // ошибок быть не должно.
	for( int i = 0; i < n; i++ )
		result |= users-> FindRecord( iduser[ i ], user[ i ] );
	return result;
}

int db_manager :: Test( )
{

	cout << "\tТестируем элементарные операции\n" << endl;



	cout << "заполняем users\t" << users-> InsRecord( "us001", "p001" ) << endl;
	cout << "заполняем users\t" << users-> InsRecord( "us002", "p002" ) << endl;
	cout << "заполняем users\t" << users-> InsRecord( "us003", "p003" ) << endl;
	cout << "заполняем users\t" << users-> InsRecord( "us004", "p003" ) << endl;
	cout << "заполняем users\t" << users-> InsRecord( "us005", "p003" ) << endl;



	cout << "совпадение логинов\t\t\t\t" << users-> InsRecord( "us002", "no" ) << endl;
	cout << "совпадение логинов\t\t\t\t" << users-> InsRecord( "us003", "no" ) << endl;



	int t = 0;
	cout << t << "\tпоиск в users\t" << users-> FindRecord( "us002", t ) << endl;
	cout << t << "\tпоиск в users\t" << users-> FindRecord( "us003", t ) << endl;
	cout << t << "\tпоиск в users\t" << users-> FindRecord( "us004", t ) << endl;

	cout << t << "\tпоиск в users\t\t\t" << users-> FindRecord( "no", t ) << endl;
	cout << t << "\tпоиск в users\t\t\t" << users-> FindRecord( "nous1", t ) << endl;



	cout << t << "\tпоиск в users\t" << users-> FindRecord( "us002", "p002", t ) << endl;
	cout << t << "\tпоиск в users\t" << users-> FindRecord( "us003", "p003", t ) << endl;
	cout << t << "\tпоиск в users\t" << users-> FindRecord( "us004", "p004", t ) << endl;
	cout << t << "\tпоиск в users\t" << users-> FindRecord( "nonono", "noo", t ) << endl << endl;



	cout << "заполняем messages\t" << messages-> InsRecord( 1, "text001" ) << endl;
	cout << "заполняем messages\t" << messages-> InsRecord( 3, "text003" ) << endl;
	cout << "заполняем messages\t" << messages-> InsRecord( 5, "text005" ) << endl;

	cout << "совпадение сообщений\t" << messages-> InsRecord( 3, "text031" ) << endl;
	cout << "совпадение сообщений\t" << messages-> InsRecord( 3, "text031" ) << endl;
	cout << "совпадение сообщений\t" << messages-> InsRecord( 3, "text031" ) << endl;

	cout << "совпадение сообщений\t" << messages-> InsRecord( 3, "text041" ) << endl;
	cout << "совпадение сообщений\t" << messages-> InsRecord( 4, "text041" ) << endl;
	cout << "совпадение сообщений\t" << messages-> InsRecord( 5, "text041" ) << endl;



	cout << "несуществуюший пользователь\t\t\t" << messages-> InsRecord( 99, "iduser99" ) << endl;
	cout << "несуществуюший пользователь\t\t\t" << messages-> InsRecord( 0, "iduser0" ) << endl;
	cout << "несуществуюший пользователь\t\t\t" << messages-> InsRecord( -7, "iduser_7" ) << endl;



	{
		int n = 12; // <= 12
		int * iduser = new int [ n ];
		int * time_ = new int [ n ];
		char * * text = new char * [ n ];
		for( int i = 0; i < n; i++ )
		{
			text[ i ] = new char [ 32 ];
			text[ i ][ 0 ] = '\0';
			time_[ i ] = -1;
		}

		cout << "получение последних сообщений\t" << messages-> GetLastMessage( n, iduser, time_, text ) << endl;
		cout << "\nпоследние сообщеня" << endl;
		for( int i = 0; i < n; i++ )
			cout << "\t" << iduser[ i ] << "\t" << time_[ i ] << "\t" << text[ i ] << endl;
		cout << endl;

		// delete
	}



	int t1 = -1;
	int t2 = -1;
	int t3 = -1;
	cout << t1 << "\tзаполняем sessions\t" << sessions-> InsRecord( 1, t1 ) << endl; // не учитываем хеш.
	cout << t2 << "\tзаполняем sessions\t" << sessions-> InsRecord( 2, t2 ) << endl;
	cout << t3 << "\tзаполняем sessions\t" << sessions-> InsRecord( 3, t3 ) << endl;



	cout << t << "\tсовпадение логинов\t" << sessions-> InsRecord( 2, t ) << endl; // хоть функция и вернула
	cout << t << "\tсовпадение логинов\t" << sessions-> InsRecord( 2, t ) << endl; // положительный результат
	cout << t << "\tсовпадение логинов\t" << sessions-> InsRecord( 3, t ) << endl; // это не значит, что
	cout << t << "\tсовпадение логинов\t" << sessions-> InsRecord( 3, t ) << endl; // добавилось новое значение



	int tid;
	cout << tid << "\tпоиск в sessions\t" << sessions-> GetIduser( t1, tid ) << endl;
	cout << tid << "\tпоиск в sessions\t" << sessions-> GetIduser( t2, tid ) << endl;
	cout << tid << "\tпоиск в sessions\t" << sessions-> GetIduser( t3, tid ) << endl;



	cout << tid << "\tпоиск в sessions\t\t\t" << sessions-> GetIduser( 0, tid ) << endl;
	cout << tid << "\tпоиск в sessions\t\t\t" << sessions-> GetIduser( -1, tid ) << endl;
	cout << tid << "\tпоиск в sessions\t\t\t" << sessions-> GetIduser( 10, tid ) << endl;
	cout << tid << "\tпоиск в sessions\t\t\t" << sessions-> GetIduser( 999, tid ) << endl;



	cout << "удаляем старые сессии\t" << sessions-> DelOldRecord( ) << endl << endl << endl;



	cout << "\tТестируем сложные операции\n" << endl;



	cout << "регистрация\t" << NewUser( "u1", "p1" ) << endl;
	cout << "регистрация\t" << NewUser( "u2", "p2" ) << endl;
	cout << "регистрация\t" << NewUser( "u3", "p3" ) << endl;
	cout << "регистрация\t" << NewUser( "u4", "p4" ) << endl;
	cout << "регистрация\t" << NewUser( "u5", "p5" ) << endl;



	cout << "повторная регистрация\t\t\t" << NewUser( "u5", "p5" ) << endl;
	cout << "повторная регистрация\t\t\t" << NewUser( "u3", "p333" ) << endl;
	cout << "повторная регистрация\t\t\t" << NewUser( "u1", "" ) << endl;



	cout << t1 << "\tполучение сессии\t" << GetSession( "u1", "p1", t1 ) << endl;
	cout << t2 << "\tполучение сессии\t" << GetSession( "u2", "p2", t2 ) << endl;
	cout << t3 << "\tполучение сессии\t" << GetSession( "u3", "p3", t3 ) << endl;



	cout << t << "\tполучение сессии\t\t\t" << GetSession( "u1", "44", t ) << endl;
	cout << t << "\tполучение сессии\t\t\t" << GetSession( "p2", "u2", t ) << endl;
	cout << t << "\tполучение сессии\t\t\t" << GetSession( "u3", "ps", t ) << endl;



	cout << "отправка сообщения\t" << NewMessage( t1, "hello1" ) << endl;
	cout << "отправка сообщения\t" << NewMessage( t2, "hello2" ) << endl;
	cout << "отправка сообщения\t" << NewMessage( t3, "hello3" ) << endl;
	cout << "отправка сообщения\t" << NewMessage( t1, "hello4" ) << endl;
	cout << "отправка сообщения\t" << NewMessage( t1, "hello5" ) << endl;
	cout << "отправка сообщения\t" << NewMessage( t3, "hello6" ) << endl;
	cout << "отправка сообщения\t" << NewMessage( t3, "hello7" ) << endl;



	cout << "отправка сообщения\t\t\t" << NewMessage( 0, "hello08" ) << endl;
	cout << "отправка сообщения\t\t\t" << NewMessage( -1, "hello09" ) << endl;
	cout << "отправка сообщения\t\t\t" << NewMessage( 1234, "hello10" ) << endl;
	cout << "отправка сообщения\t\t\t" << NewMessage( 9, "hello11" ) << endl;
	cout << "отправка сообщения\t\t\t" << NewMessage( 54321, "hello12" ) << endl;



	{
		int n = 19; // <= 19
		int * time_ = new int [ n ];
		char * * user = new char * [ n ];
		char * * text = new char * [ n ];
		for( int i = 0; i < n; i++ )
		{
			user[ i ] = new char [ 32 ];
			user[ i ][ 0 ] = '\0';
			text[ i ] = new char [ 32 ];
			text[ i ][ 0 ] = '\0';
			time_[ i ] = -1;
		}

		cout << "получение последних сообщений\t" << GetLastMessages( n, user, time_, text ) << endl;
		cout << "\nпоследние сообщеня" << endl;
		for( int i = 0; i < n; i++ )
			cout << "\t" << user[ i ] << "\t" << time_[ i ] << "\t" << text[ i ] << endl;
		cout << endl;
	}



	return 0;
}
